{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "# Mnist手写数字识别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "hidden": true
   },
   "outputs": [],
   "source": [
    "#导入必要库包\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true
   },
   "source": [
    "# 导入数据集，并查看数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-bea682df816f>:2: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "#导入mnist手写数字识别数据集\n",
    "mnist = input_data.read_data_sets('./', one_hot=False)\n",
    "mnist_check = input_data.read_data_sets('./') "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true,
    "hidden": true
   },
   "source": [
    "## 查看各数据集类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "print(mnist_check.train.images.shape)\n",
    "print(mnist_check.train.labels.shape)\n",
    "\n",
    "print(mnist_check.validation.images.shape)\n",
    "print(mnist_check.validation.labels.shape)\n",
    "\n",
    "print(mnist_check.test.images.shape)\n",
    "print(mnist_check.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hidden": true
   },
   "source": [
    "mnist数据集分为三个子数据集：训练集，验证集，测试集。训练集有55000个样本，验证集为5000个样本，测试集为10000个样本。其中输入部分为images，是长度为784的一维向量（实际是28x28的图片）；真值labels是图片对应的数字，是长度为1的一维向量。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": true,
    "hidden": true
   },
   "source": [
    "## 查看images及对应的labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "hidden": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist_check.train.labels[idx+1]))\n",
    "    plt.imshow(mnist_check.train.images[idx+1].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 神经网络模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#help(tf.train.MomentumOptimizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "x = tf.placeholder(\"float32\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"int64\", [None], name='y')\n",
    "learning_rate = tf.placeholder(tf.float32)\n",
    "\n",
    "#tf.random.set_random_seed(42)\n",
    "\n",
    "# 定义隐层激活函数\n",
    "#def swish(x):\n",
    "    #return x*tf.sigmoid(x)\n",
    "\n",
    "#def selu(x):\n",
    "   #with tf.name_scope('elu') as scope:\n",
    "        #alpha = 1.6732632423543772848170429916717\n",
    "        #scale = 1.0507009873554804934193349852946\n",
    "        #return scale*tf.where(x>=0.0, x, alpha*tf.nn.elu(x))\n",
    "\n",
    "def activation(x):\n",
    "    #return tf.nn.sigmoid(x)\n",
    "    #return tf.nn.tanh(x)\n",
    "    return tf.nn.relu(x)\n",
    "    #return tf.nn.selu(x)\n",
    "    #return tf.nn.swish(x)\n",
    "\n",
    "# 参数初始化器\n",
    "def initialize(shape, stddev = 0.1):\n",
    "    return tf.truncated_normal(shape, stddev = 0.1) # Xavier或MSRA初始化只需要改变stddev即可\n",
    "    #return tf.random_uniform(shape, a, b) #均匀分布初始化，可用于Xavier，但参数跟上面略有不同 \n",
    "    \n",
    "# 构建网络\n",
    "# 隐层1\n",
    "L1_units_count = 5000\n",
    "W1 = tf.Variable(initialize([784,L1_units_count], stddev = 0.0026))\n",
    "b1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W1) + b1\n",
    "\n",
    "output_1 = activation(logits_1)\n",
    "\n",
    "# 隐层2\n",
    "L2_units_count = 80\n",
    "W2 = tf.Variable(initialize([L1_units_count, L2_units_count], stddev = 0.0004))\n",
    "b2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W2) + b2\n",
    "\n",
    "output_2 = activation(logits_2)\n",
    "\n",
    "# 隐层3\n",
    "#L3_units_count = 100\n",
    "#W3 = tf.Variable(initialize([L2_units_count, L3_units_count], stddev = 0.05))\n",
    "#b3 = tf.Variable(initialize([L3_units_count]))\n",
    "#logits_3 = tf.matmul(output_2, W3) + b3\n",
    "\n",
    "#output_3 = activation(logits_3)\n",
    "\n",
    "# 输出层\n",
    "L3_units_count = 10\n",
    "W3 = tf.Variable(initialize([L2_units_count, L3_units_count], stddev = 0.0250))\n",
    "b3 = tf.Variable(initialize([L3_units_count]))\n",
    "logits_3 = tf.matmul(output_2, W3) + b3\n",
    "\n",
    "\n",
    "# 交叉熵损失\n",
    "cross_entropy_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits_3, labels=y))\n",
    "\n",
    "# 增加正则项\n",
    "#L1_loss = tf.contrib.layers.l1_regularizer(7e-5)(W1) + tf.contrib.layers.l1_regularizer(7e-5)(W2)\n",
    "#L2_loss = tf.contrib.layers.l2_regularizer(7e-5)(W1) + tf.contrib.layers.l2_regularizer(7e-5)(W2)\n",
    "#L2_loss = tf.nn.l2_loss(W1) + tf.nn.l2_loss(W2)\n",
    "\n",
    "total_loss = cross_entropy_loss \n",
    "\n",
    "# 优化器\n",
    "def optimizer():\n",
    "    #return tf.train.GradientDescentOptimizer(learning_rate = learning_rate)\n",
    "    #return tf.train.MomentumOptimizer(learning_rate = 1e-3, momentum = 0.9, use_nesterov=False)\n",
    "    #return tf.train.AdagradOptimizer(learning_rate = 1e-3)\n",
    "    #return tf.train.AdadeltaOptimizer()\n",
    "    #return tf.train.RMSPropOptimizer(learning_rate = 1e-3)\n",
    "    return tf.train.AdamOptimizer()\n",
    "\n",
    "opt = optimizer().minimize(total_loss)\n",
    "\n",
    "# 用accuracy评价模型\n",
    "pred = tf.nn.softmax(logits_3)\n",
    "correct_pred = tf.equal(tf.argmax(logits_3, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 设置session训练运行模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "code_folding": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step [100], the loss is [0.39457252621650696].\n",
      "Accuracy on validation set: 0.9241999983787537\n",
      "Accuracy on test set: 0.9186000227928162\n",
      "step [200], the loss is [0.13731905817985535].\n",
      "Accuracy on validation set: 0.9435999989509583\n",
      "Accuracy on test set: 0.944599986076355\n",
      "step [300], the loss is [0.0961671844124794].\n",
      "Accuracy on validation set: 0.9422000050544739\n",
      "Accuracy on test set: 0.9391000270843506\n",
      "step [400], the loss is [0.0995277687907219].\n",
      "Accuracy on validation set: 0.9570000171661377\n",
      "Accuracy on test set: 0.9519000053405762\n",
      "step [500], the loss is [0.05673050507903099].\n",
      "Accuracy on validation set: 0.9559999704360962\n",
      "Accuracy on test set: 0.9537000060081482\n",
      "step [600], the loss is [0.15475061535835266].\n",
      "Accuracy on validation set: 0.9639999866485596\n",
      "Accuracy on test set: 0.9593999981880188\n",
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/python/training/saver.py:966: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "step [700], the loss is [0.09088033437728882].\n",
      "Accuracy on validation set: 0.9682000279426575\n",
      "Accuracy on test set: 0.9646999835968018\n",
      "step [800], the loss is [0.1533854901790619].\n",
      "Accuracy on validation set: 0.9674000144004822\n",
      "Accuracy on test set: 0.9639999866485596\n",
      "step [900], the loss is [0.05167839676141739].\n",
      "Accuracy on validation set: 0.9700000286102295\n",
      "Accuracy on test set: 0.9710999727249146\n",
      "step [1000], the loss is [0.07428565621376038].\n",
      "Accuracy on validation set: 0.9714000225067139\n",
      "Accuracy on test set: 0.9684000015258789\n",
      "step [1100], the loss is [0.0237280186265707].\n",
      "Accuracy on validation set: 0.972000002861023\n",
      "Accuracy on test set: 0.9627000093460083\n",
      "step [1200], the loss is [0.06611557304859161].\n",
      "Accuracy on validation set: 0.9724000096321106\n",
      "Accuracy on test set: 0.9678999781608582\n",
      "step [1300], the loss is [0.09034434705972672].\n",
      "Accuracy on validation set: 0.967199981212616\n",
      "Accuracy on test set: 0.9634000062942505\n",
      "step [1400], the loss is [0.05407275632023811].\n",
      "Accuracy on validation set: 0.9685999751091003\n",
      "Accuracy on test set: 0.9635000228881836\n",
      "step [1500], the loss is [0.028272442519664764].\n",
      "Accuracy on validation set: 0.9761999845504761\n",
      "Accuracy on test set: 0.970300018787384\n",
      "step [1600], the loss is [0.0366327241063118].\n",
      "Accuracy on validation set: 0.9724000096321106\n",
      "Accuracy on test set: 0.9674999713897705\n",
      "step [1700], the loss is [0.03251396119594574].\n",
      "Accuracy on validation set: 0.9732000231742859\n",
      "Accuracy on test set: 0.968999981880188\n",
      "step [1800], the loss is [0.03993529453873634].\n",
      "Accuracy on validation set: 0.9751999974250793\n",
      "Accuracy on test set: 0.9736999869346619\n",
      "step [1900], the loss is [0.06316374242305756].\n",
      "Accuracy on validation set: 0.9742000102996826\n",
      "Accuracy on test set: 0.9750999808311462\n",
      "step [2000], the loss is [0.03624291718006134].\n",
      "Accuracy on validation set: 0.9746000170707703\n",
      "Accuracy on test set: 0.9746000170707703\n",
      "step [2100], the loss is [0.06670073419809341].\n",
      "Accuracy on validation set: 0.9757999777793884\n",
      "Accuracy on test set: 0.9713000059127808\n",
      "step [2200], the loss is [0.017212742939591408].\n",
      "Accuracy on validation set: 0.9739999771118164\n",
      "Accuracy on test set: 0.9753999710083008\n",
      "step [2300], the loss is [0.06908343732357025].\n",
      "Accuracy on validation set: 0.9684000015258789\n",
      "Accuracy on test set: 0.9663000106811523\n",
      "step [2400], the loss is [0.0302540585398674].\n",
      "Accuracy on validation set: 0.9751999974250793\n",
      "Accuracy on test set: 0.9700999855995178\n",
      "step [2500], the loss is [0.052764181047677994].\n",
      "Accuracy on validation set: 0.9782000184059143\n",
      "Accuracy on test set: 0.9745000004768372\n",
      "step [2600], the loss is [0.04507448524236679].\n",
      "Accuracy on validation set: 0.9742000102996826\n",
      "Accuracy on test set: 0.9750000238418579\n",
      "step [2700], the loss is [0.003938495181500912].\n",
      "Accuracy on validation set: 0.974399983882904\n",
      "Accuracy on test set: 0.9732000231742859\n",
      "step [2800], the loss is [0.0641883909702301].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9793000221252441\n",
      "step [2900], the loss is [0.0037436720449477434].\n",
      "Accuracy on validation set: 0.9775999784469604\n",
      "Accuracy on test set: 0.975600004196167\n",
      "step [3000], the loss is [0.006500815041363239].\n",
      "Accuracy on validation set: 0.977400004863739\n",
      "Accuracy on test set: 0.9750999808311462\n",
      "step [3100], the loss is [0.08641874045133591].\n",
      "Accuracy on validation set: 0.973800003528595\n",
      "Accuracy on test set: 0.9721999764442444\n",
      "step [3200], the loss is [0.06005037575960159].\n",
      "Accuracy on validation set: 0.973800003528595\n",
      "Accuracy on test set: 0.9753000140190125\n",
      "step [3300], the loss is [0.02719162404537201].\n",
      "Accuracy on validation set: 0.9747999906539917\n",
      "Accuracy on test set: 0.9728999733924866\n",
      "step [3400], the loss is [0.005429614335298538].\n",
      "Accuracy on validation set: 0.977400004863739\n",
      "Accuracy on test set: 0.9750000238418579\n",
      "step [3500], the loss is [0.0013156725326552987].\n",
      "Accuracy on validation set: 0.9810000061988831\n",
      "Accuracy on test set: 0.979200005531311\n",
      "step [3600], the loss is [0.018076766282320023].\n",
      "Accuracy on validation set: 0.9783999919891357\n",
      "Accuracy on test set: 0.9789999723434448\n",
      "step [3700], the loss is [0.007958092726767063].\n",
      "Accuracy on validation set: 0.977400004863739\n",
      "Accuracy on test set: 0.9771999716758728\n",
      "step [3800], the loss is [0.04416235536336899].\n",
      "Accuracy on validation set: 0.9739999771118164\n",
      "Accuracy on test set: 0.9699000120162964\n",
      "step [3900], the loss is [0.018404819071292877].\n",
      "Accuracy on validation set: 0.9760000109672546\n",
      "Accuracy on test set: 0.9760000109672546\n",
      "step [4000], the loss is [0.002456415444612503].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9757999777793884\n",
      "step [4100], the loss is [0.0009612352005206048].\n",
      "Accuracy on validation set: 0.975600004196167\n",
      "Accuracy on test set: 0.9758999943733215\n",
      "step [4200], the loss is [0.09835352003574371].\n",
      "Accuracy on validation set: 0.97079998254776\n",
      "Accuracy on test set: 0.9717000126838684\n",
      "step [4300], the loss is [0.03456760197877884].\n",
      "Accuracy on validation set: 0.979200005531311\n",
      "Accuracy on test set: 0.9772999882698059\n",
      "step [4400], the loss is [0.1209968626499176].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9749000072479248\n",
      "step [4500], the loss is [0.008579513058066368].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9786999821662903\n",
      "step [4600], the loss is [0.011908692307770252].\n",
      "Accuracy on validation set: 0.9797999858856201\n",
      "Accuracy on test set: 0.9779000282287598\n",
      "step [4700], the loss is [0.06349615752696991].\n",
      "Accuracy on validation set: 0.9765999913215637\n",
      "Accuracy on test set: 0.9768999814987183\n",
      "step [4800], the loss is [0.003086748532950878].\n",
      "Accuracy on validation set: 0.9769999980926514\n",
      "Accuracy on test set: 0.9783999919891357\n",
      "step [4900], the loss is [0.003849618136882782].\n",
      "Accuracy on validation set: 0.9775999784469604\n",
      "Accuracy on test set: 0.9760000109672546\n",
      "step [5000], the loss is [0.04863754287362099].\n",
      "Accuracy on validation set: 0.9810000061988831\n",
      "Accuracy on test set: 0.9787999987602234\n",
      "step [5100], the loss is [0.0020373414736241102].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9750999808311462\n",
      "step [5200], the loss is [0.01601340062916279].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9789000153541565\n",
      "step [5300], the loss is [0.00959748588502407].\n",
      "Accuracy on validation set: 0.9810000061988831\n",
      "Accuracy on test set: 0.9817000031471252\n",
      "step [5400], the loss is [0.0092619638890028].\n",
      "Accuracy on validation set: 0.9787999987602234\n",
      "Accuracy on test set: 0.9786999821662903\n",
      "step [5500], the loss is [0.004986076150089502].\n",
      "Accuracy on validation set: 0.9751999974250793\n",
      "Accuracy on test set: 0.9746999740600586\n",
      "step [5600], the loss is [0.0007018840406090021].\n",
      "Accuracy on validation set: 0.9778000116348267\n",
      "Accuracy on test set: 0.9778000116348267\n",
      "step [5700], the loss is [0.010845781303942204].\n",
      "Accuracy on validation set: 0.9732000231742859\n",
      "Accuracy on test set: 0.9681000113487244\n",
      "step [5800], the loss is [0.0032519351225346327].\n",
      "Accuracy on validation set: 0.9800000190734863\n",
      "Accuracy on test set: 0.9781000018119812\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step [5900], the loss is [0.06710854172706604].\n",
      "Accuracy on validation set: 0.979200005531311\n",
      "Accuracy on test set: 0.9763000011444092\n",
      "step [6000], the loss is [0.009133473969995975].\n",
      "Accuracy on validation set: 0.9828000068664551\n",
      "Accuracy on test set: 0.9797000288963318\n",
      "\n",
      "Model training is done!\n"
     ]
    }
   ],
   "source": [
    "# 设置batch_size和train_step\n",
    "batch_size = 64\n",
    "train_step = 6000\n",
    "\n",
    "# 用于保存或恢复训练模型\n",
    "saver = tf.train.Saver()\n",
    "\n",
    "sess = tf.Session()\n",
    "sess.run(tf.global_variables_initializer())\n",
    "\n",
    "# 定义验证集和测试集\n",
    "Validation_data = {x: mnist.validation.images, y: mnist.validation.labels}\n",
    "test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "# 运行模型训练\n",
    "for i in range(train_step):\n",
    "#     if i < 1500:\n",
    "#         lr = 1.0\n",
    "#     elif i < 3000:\n",
    "#         lr = 0.3\n",
    "#     elif i < 4500:\n",
    "#         lr = 0.1   \n",
    "#     else:\n",
    "#         lr = 0.03\n",
    "    x_train, y_train = mnist.train.next_batch(batch_size)\n",
    "    _, loss = sess.run([opt, total_loss],\n",
    "                       feed_dict={\n",
    "                           x: x_train,\n",
    "                           y: y_train,\n",
    "                           #learning_rate: lr\n",
    "    })\n",
    "\n",
    "    # 输出每100步结果\n",
    "    if (i + 1) % 100 == 0:\n",
    "        print(\"step [{}], the loss is [{}].\".format(i + 1, loss))\n",
    "        print(\"Accuracy on validation set: {}\".format(\n",
    "            sess.run(accuracy, feed_dict=Validation_data)))\n",
    "        print(\"Accuracy on test set: {}\".format(\n",
    "            sess.run(accuracy, feed_dict=test_data)))\n",
    "        saver.save(sess, './model.ckpt', global_step=i)\n",
    "    \n",
    "print(\"\\nModel training is done!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /home/kite/anaconda3/lib/python3.7/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-5999\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
